﻿#pragma once

#include "UIInclude.h"

_NAMESPACE_BEGIN

class WidgetWindow;
class WidgetListBox;
class WidgetComboBox;
class WidgetButton;
class WidgetRadioButton;
class WidgetEditBox;
class WidgetMultilineList;

/// GUI图形用户接口系统管理类，用于统一管理GUI模块的创建、修改、生成等操作

class UiSystem
{
public:
	/// 单体类声明
	SINGLETON_HELPER(UiSystem)

	UiSystem();
	virtual ~UiSystem();

public:
	
	/// 初始化GUI管理系统对象
	void						Initial();

	/// 释放GUI对象
	void						Release();

	/// 从Root添加新CEGUI窗口
	/// \param[in] win CEGUI::Window* 指针
	void						AddWindowFromRoot(CEGUI::Window* win);

	/// 从Root添加WidgetWindow窗口
	/// \param[in] window NatRacing::WidgetWindow* 指针
	void						RootAddWindow(WidgetWindow* window);
	 
	/// 获取UI渲染器
	/// \return CEGUI::OgreCEGUIRenderer* 指针，Ogre对CEGUI的渲染系统
	CEGUI::OgreCEGUIRenderer*	GetUIRender(){return mGUIRenderer;}

	/// 获取CEGUI系统接口
	/// \return CEGUI::System* 指针，CEGUI的系统接口，与渲染无关
	CEGUI::System*				GetUISystem(){return mGUISystem;}

	/// 为窗口创建可以使用的图片资源
	/// \param[in] resName 图片资源的文件名
	/// \param[in] name 图片名，用于标识这个资源
	void						CreateImage(CONST_REF(string) resName, CONST_REF(string) name);	

	/// 获取给定名称标识的图片集
	/// \return CEGUI::Imageset* 指针，CEGUI的图片集指针
	CEGUI::Imageset*			GetImgSet(CONST_REF(string) name);

	/// 获取给定名称标识的WidgetListBox列表框对象指针
	/// \return WidgetListBox* 指针，即本项目为脚本使用封装后的列表框控件对象指针
	WidgetListBox*				GetListBox(CONST_REF(string) name);

	/// 获取给定名称标识的WidgetComboBox组合列表框对象指针
	/// \return WidgetComboBox* 指针，即本项目为脚本使用封装后的组合列表框控件对象指针
	WidgetComboBox*				GetComboBox(CONST_REF(string) name);

	/// 获取给定名称标识的WidgetButton按钮对象指针
	/// \return WidgetButton* 指针，即本项目为脚本使用封装后的按钮控件对象指针
	WidgetButton*				GetButton(CONST_REF(string) name);
	

	/// 获取给定名称标识的WidgetRadioButton按钮对象指针
	/// \return WidgetRadioButton* 指针，即本项目为脚本使用封装后的单选按钮控件对象指针
	WidgetRadioButton*			GetRadioButton(CONST_REF(string) name);


	/// 获取给定名称标识的WidgetEditBox按钮对象指针
	/// \return WidgetEditBox* 指针，即本项目为脚本使用封装后的编辑框控件对象指针
	WidgetEditBox*				GetEditBox(CONST_REF(string) name);

	/// 获取给定名称标识的WidgetMultilineList按钮对象指针
	/// \return WidgetMultilineList* 指针，即本项目为脚本使用封装后的编辑框控件对象指针
	WidgetMultilineList*		GetMultilineList(CONST_REF(string) name);


	/// 给指定名称标识的组合列表框ComboBox控件添加新的项
	/// \param[in] name 控件的唯一名称标识
	/// \param[in] item 添加的新项的文本内容
	/// \param[in] id 要添加的新项的id
	void						AddComboBoxItem(CONST_REF(string) name,CONST_REF(string) item,int id);

	/// 给指定名称标识的列表框ListBox控件添加新的项
	/// \param[in] name 控件的唯一名称标识
	/// \param[in] item 添加的新项的文本内容
	/// \param[in] id 要添加的新项的id
	void						AddListBoxItem(CONST_REF(string) name,CONST_REF(string) item,int id);

protected:

	/// Ogre提供给CEGUI的渲染系统
	CEGUI::OgreCEGUIRenderer*	mGUIRenderer;

	/// CEGUI的系统接口
	CEGUI::System*				mGUISystem;

	/// CEGUI的基本窗口对象指针，其他添加的窗口都要附加在这个窗口上
	CEGUI::Window*				mEditorGuiSheet;

	/// 供所有窗口使用的图片资源
	hash_map<string,CEGUI::Imageset*> imageSets;	
};

_NAMESPACE_END